package org.jboss.forge.test.roaster.model;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.everyItem;
import static org.hamcrest.CoreMatchers.instanceOf;
import java.util.List;
import org.hamcrest.BaseMatcher;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Description;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.JavaClass;
import org.jboss.forge.roaster.model.JavaInterface;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.jboss.forge.roaster.model.source.JavaSource;
import org.junit.Assert;
import org.junit.Test;
public class JavaLocalClassTest
{
@Test
public void testLocalClassMatch()
{
JavaClassSource source = Roaster.parse(JavaClassSource.class,
getClass().getResourceAsStream("/org/jboss/forge/grammar/java/MockLocalClass.java"));
Assert.assertFalse(source.isLocalClass());
List<JavaSource<?>> nestedTypes = source.getNestedTypes();
Assert.assertThat(nestedTypes.size(), equalTo(17));
Assert.assertThat(nestedTypes.get(0), instanceOf(JavaInterface.class));
Assert.assertThat(nestedTypes.subList(1, 17),
everyItem(allOf(CoreMatchers.<JavaSource<?>> instanceOf(JavaClass.class), new IsLocalMatcher())));
}
private class IsLocalMatcher extends BaseMatcher<JavaSource<?>>
{
@Override
public boolean matches(Object item)
{
if (item instanceof JavaClass)
{
return ((JavaClass<?>) item).isLocalClass();
}
return false;
}
@Override
public void describeTo(Description description)
{
description.appendText("a local class");
}
@Override
public void describeMismatch(Object item, Description description)
{
description.appendValue(item).appendText("is not a local class");
}
}
}